#include"mystdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

static MY_FILE *Buyfile(int fd,int flag)
{
  MY_FILE *f=(MY_FILE *)malloc(sizeof(MY_FILE));
  if(f==NULL)
    return NULL;

  f->bufferlen=0;
  f->flag=flag;
  f->fileno=fd;
  f->flush_method=LINE_FLUSH;
  memset(f->outbuffer,0,sizeof(f->outbuffer));
  return f;
}

MY_FILE * MyFopen(const char *path,const char *mode)
{
  int fd=-1;
  int flag=0;
  if(strcmp(mode,"w")==0)
  {
    flag=O_CREAT | O_WRONLY | O_TRUNC;
    fd=open(path,flag,0666);

  }
  else if(strcmp(mode,"a")==0)
  {
    
    flag=O_CREAT | O_WRONLY | O_APPEND;
    fd=open(path,flag,0666);
  }
  else if(strcmp(mode,"r")==0)
  {
    flag=O_RDWR;
    fd=open(path,flag);
  }
  else{

  }
  if(fd<0)
  {
    return NULL;
  }
   return Buyfile(fd,flag);

}
void MyFclose(MY_FILE * file){
  if(file->fileno<0)
  {
    return;
  }
  MyFFlush(file);
  close(file->fileno);
  free(file);
}

int Mywrite(MY_FILE *file,void *str,int len){
  memcpy(file->outbuffer+file->bufferlen,str,len);
  file->bufferlen+=len;
  if((file->flush_method & LINE_FLUSH)&&file->outbuffer[file->bufferlen-1]=='\n')
  {
    MyFFlush(file);
  }
  return 0;
}

void MyFFlush(MY_FILE *file)
{
  if(file->bufferlen <=0)
  {
    return;
  }
  int n=write(file->fileno,file->outbuffer,file->bufferlen);
  (void)n;

  fsync(file->fileno);
  file->bufferlen=0;

}
